#ifndef __FIFO_H__
#define __FIFO_H__

#include <stdbool.h>
#include <stdint.h>
#ifdef _cplusplus
extern "C"
{
#endif //_cplusplus

	/*!
	 * FIFO
	 */
	typedef struct sFifo
	{
		uint16_t Begin;
		uint16_t End;
		uint8_t *Data;
		uint16_t Size;
	} tFifo;

	void FifoInit(tFifo *fifo, uint8_t *buffer, uint16_t len);
	void FifoPush(tFifo *fifo, uint8_t val);
	void FifoPush_IT(tFifo *fifo, uint8_t val);
	uint8_t FifoPop(tFifo *fifo);
	uint8_t FifoPop_IT(tFifo *fifo);
	void FifoFlush(tFifo *fifo);
	bool IsFifoEmpty(const tFifo *fifo);
	bool IsFifoFull(const tFifo *fifo);
	uint16_t FifoFreeSpace(const tFifo *fifo);
	uint16_t FifoUsedSpace(const tFifo *fifo);
	void Fifo_Reset(tFifo *fifo);
#ifdef _cplusplus
}
#endif
#endif // __FIFO_H__
